|
Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 30-03-2012, 11:30. Υπάρχουν 10 απαντήσεις.
-
27-03-2012, 19:16
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Καλησπέρα για ακόμα μια φορά φόρουμ! έχω μια απορία... Θέλουμε
να βάλουμε άγνωστο πλήθος τιμών μέσα σε μια μεταβλητή. -Είναι γνωστό ότι αυτή η
μεταβλητή θα χρησιμοποιηθεί για πράξεις αργότερα-
Είναι καλύτερα να κάνουμε μια «μεταβλητή()» και να την
κάνουμε redim preserve,
ή να κάνουμε μια «μεταβλητή List(Of Τ)»?
(Με εξαίρεση το «κάνε μια μεταβλητή(99999) [με μεγάλο
αριθμό], αν υπάρχουν κι άλλοι τρόποι να το κάνω που θα είναι πιο γρήγοροι,
πείτε μου)
btw,
κάπου είχα δει και μια μεταβλητή dictionary – ακόμα δεν κατάλαβα τι κάνει,
αλλά την αναφέρω σε περίπτωση που μπορεί να έχει application εδώ.
|
|
-
27-03-2012, 22:19
|
|
Απ: Μεταξύ δύο μεταβλητών...
Καλησπέρα, Η αλήθεια είναι πως θέλεις να λύσεις το πρόβλημά σου θα σου υποδείξει τον τρόπο - αν θες να το λύσεις "σαν μαθηματικός" θα πας με τον πίνακα, και αν θες να αποφύγεις το σκόπελο του "κάνε μια μεταβλητή(99999)" με ένα έξυπνο τρόπο, για να μην κάνεις ReDim στην προσθήκη κάθε "γραμμής", θα μπορείς να κάνεις μια αρχική τιμή πχ 64, και όταν το γεμίσεις το ReDim που θα ακολουθήσει θα πρέπει να είναι στο 128 (+64)...
- αν θες να το λύσεις σαν προγραμματιστής θα χρεισιμοποιήσεις την "μεταβλητή List(Of T)" - μπορείς να χρησιμοποιήσεις την LINQ και να βγάλεις πολύ εύκολα αθροίσματα, μέσους όρους, ελάχιστα, μέγιστα με μια γραμμή.
Το dictionary δεν είναι παρά μια εξέλιξη του hash table, μόνο που είναι strong typed. George J.
|
|
-
27-03-2012, 23:18
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Ωραία :) Ευχαριστώ πολύ!
Φοβόμουν μήπως Η "μεταβλητή List(Of T)" είναι πολύ αργή και δεν αξίζει άμα είναι να την καλώ συχνά... Αυτό το LINQ το βρίσκω παντού μπροστά μου... πρέπει κάποια στιγμή να βρω χρόνο να το μάθω!
Ο παρακάτω κώδικας δεν κάνει κάτι, απλώς για να καταλάβετε την ερώτηση που θα ακολουθήσει ρίξτε μια ματιά: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| Dim lstSomething As New ListBox
For i = 0 To Something.Length
If Something(i) <> String.Empty Then
lstSomething.Items.Add(Something)
End If
Next
Dim lstSomethingElse As New ListBox
For i = 0 To SomethingElse.Length
If SomethingElse(i) <> String.Empty Then
lstSomethingElse.Items.Add(SomethingElse)
End If
Next
For i = 0 To lstSomething.Items.Count - 2
If lstSomething.Items(i).ToString = Whatever Then
Dim tmp As String = lstSomething.Items(i).ToString
Dim tmp2 As String = lstSomethingElse.Items(i).ToString
lstSomething.Items(i) = lstSomething.Items(i + 1)
lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
lstSomething.Items(i) = tmp
lstSomethingElse.Items(i) = tmp2
End If
Next |
Έχουμε λοιπόν ένα κώδικα ο οποίος βάζει κάτι μέσα σε 2 μεταβλητές Listbox, μετά ψάχνει να βρει κάτι άλλο.. και αν το βρει αλλάζει τα δεδομένα και στα 2 listboxes (θεωρούμε ότι συνδέονται άμεσα τα 2 listboxes και έχουν τον ίδιο αριθμό αντικειμένων) Τα listbox είναι (απόσο ξέρω τουλάχιστον) αργές μεταβλητές.. και όταν έχουμε να κάνουμε με χιλιάδες σειρές.. παίρνει κάποια ώρα. Αν το ίδιο πράγμα το είχα κάνει με "Μεταβλητή (List of String)" αντί για listbox, θα έβλεπα βελτίωση στην απαιτούμενη ώρα? (Η ερώτησή μου έχει άμεση σχέση με το πρώτο ποστ που έκανα - γιατί όταν είπα ότι θα κάνω πράξεις με αυτά, δεν εννοούσα τόσο πραγματικά πράξεις, όσο αυτό το πράγμα.. δηλαδή να διαβάζω τι έχει μέσα σε συγκεκριμένα indexes, και να αλλάζω τις τιμές στα ίδια indexes σε 2 ή περισσότερες μεταβλητές ταυτόχρονα) Τώρα πιθανόν να το χρειαστώ και για πράξεις πράξεις, άρα το LINQ σίγουρα θα μου χρησιμεύσει. Αυτό που αναρωτιέμαι είναι αν τα έχω σωστά στο μυαλό μου [ listbox < list (of T) < Variable()
], δηλαδή ότι σε θέμα ταχύτητας το listbox είναι αργό, το List (of T) έχει διαφορά, και το variable() είναι πιο γρήγορο αλλά όχι με τεράστια διαφορά απο το list (of T)
|
|
-
28-03-2012, 00:52
|
|
Απ: Μεταξύ δύο μεταβλητών...
Θεωριτικά η λίστα είναι ένα πλούσιο αντικείμενο, άρα και πιο αργό, αλλά πρακτικά μπορεί να λύσει περισσότερα προβλήματα πιο γρήγορα, πχ: Ο αντίστοιχος κώδικας σε Linq θα ήταν κάπως έτσι: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| Dim lstSomethingSource As List(Of String)
lstSomethingSource = Something
lstSomething.DataSource = lstSomethingSource
Dim lstSomethingElseSource As List(Of String)
lstSomethingElseSource = From s In Something Where s <> String.Empty Select s
lstSomething.DataSource = lstSomethingSource
Dim i As Integer = 0
Dim Whatever As String = "Value"
For Each s As String In lstSomething.Items
If lstSomething.Items(i).ToString = Whatever Then
Dim tmp As String = lstSomething.Items(i).ToString
Dim tmp2 As String = lstSomethingElse.Items(i).ToString
lstSomething.Items(i) = lstSomething.Items(i + 1)
lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
lstSomething.Items(i) = tmp
lstSomethingElse.Items(i) = tmp2
End If
i = i + 1
Next |
Επειδή έχουμε Databinding επάνω στο control, σίγουρα θα γεμίσει πιο γρήγορα το control, από τον δικό σου τρόπο - αυτό δεν οφείλεται στη λίστα, αλλά στο τρόπο που γεμίζει. Η λίστα για το δεύτερο listbox φιλτράρει με LINQ - κώδικας είναι πολύ πιο καθαρός και εύκολος στην κατανόηση. Ωστόσο στην περίπτωση που αλλάζεις τιμές σε ορισμένα items, δεν υπάρχει κάτι καλύτερο να κάνεις - αν όμως υπήρχει τρόπος που με φιλτράρισμα και μεταμόρφωση (trasform) μπορούσε να επιτευχθεί, θα μπορούσε να εκφραστεί σε Linq, άρα θα είχες και την λίστα σου πιο εύκολα, η λίστα με DataBinding θα σου έδεινε και την ταχύτητα θέλεις, κοκ... George J.
|
|
-
28-03-2012, 18:24
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Αχά, ωραία :) Μου γεννήθηκαν όμως μερικές ακόμα ερωτήσεις.... :Ρ
1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ?? 1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι? 2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα? 3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς: 1
2
3
| Dim lstSomethingElseSource As List(Of String)
lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
lstSomethingELSE.DataSource = lstSomethingELSESource |
?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες) 3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά? 3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά? 4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά? 4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)
btw, Τα νούμερα στις ερωτήσεις τα βάζω για να ξεχωρίζουν και να φαίνονται πιο καλά, αλλά αν σας την σπάει, μπορώ να το σταματήσω.
|
|
-
29-03-2012, 11:14
|
-
nikos123
-
-
-
Μέλος από τις 26-04-2006
-
-
Δημοσιεύσεις 104
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Δεν μπορείς να συγκρίσεις το List<T> με το ListBox. To List<Τ> είναι μια δομή θέσεων στη μνήμη για αποθήκευση δεδομένων (συνήθως ίδιου τύπου). Το Listbox είναι Control και εκτός από τα δεδομένα του (Items) έχει και visual εμφάνιση (painting, fonts...), δίνει τη δυνατότητα στο χρήστη να κάνει κλικ , να επιλέξει Item. Όλα αυτά έχουν κάποιο κόστος σε μνήμη , resources και χρόνο. Για τα δεδομένα του το ListBox μπορεί να χρησιμοποιήσει οποιαδήποτε δομή που κάνει implement το IList.
Αν ορίσεις DataSource το lstSomethingSource και μετά προσθέσεις κάτι στο lstSomethingSource θα δεις αλλαγή στο ListBox μόνο αν το lstSomethingSource υποστηρίζει notifications. Διαφορετικά θα πρέπει να ανανεώσεις το binding.
|
|
-
29-03-2012, 12:27
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Αχά, άρα με λίγα δεν είναι αλληλένδετα εκτός κιαν ορίσεις "notification". Αν έχεις χρόνο απάντησε και σε μερικές ακόμα απο ερωτήσεις μου (προηγούμενο ποστ) :)
|
|
-
29-03-2012, 13:35
|
-
nikos123
-
-
-
Μέλος από τις 26-04-2006
-
-
Δημοσιεύσεις 104
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Με LINQ δεν έχω ασχοληθεί, οπότε μπορεί να τα πω λάθος. Όσο για τα notifications, υποστηρίζει το BindingList<T> . BindingList<string> list = new BindingList<string>();
list.Add("1");
list.Add("2");
listBox1.DataSource = list;
list.Add("3");
list.Add("4"); Στο listBox1 θα εμφανιστούν και τα 3, 4 που προστέθηκαν μετά το Binding. Αν είχες List θα εμφάνιζε μόνο τα 1, 2.
|
|
-
29-03-2012, 13:45
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Άα άρα μιλάμε για άλλη εντελώς μεταβλητή. Ωραία, good to know. Ευχαριστώ φίλε μου :)
Btw, για όσους διαβάσουν αυτό το μήνυμα, να ξέρετε ότι υπάρχουν κι άλλες άλυτες ερωτήσεις μου πιο πάνω. Και για να μην ψάχνετε να τις βρίσκεται, τις ξαναγράφω εδώ: 1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ??
1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι?
2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα?
3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς:
1
2
3
| Dim lstSomethingElseSource As List(Of String)
lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
lstSomethingELSE.DataSource = lstSomethingELSESource |
?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες) 3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά? 3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά? 4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά? 4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)
|
|
-
30-03-2012, 11:04
|
|
Απ: Μεταξύ δύο μεταβλητών...
AlKiS: 1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ?? 1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι? 2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα? 3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς: 1
2
3
| Dim lstSomethingElseSource As List(Of String)
lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
lstSomethingELSE.DataSource = lstSomethingELSESource |
?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες) 3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά? 3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά? 4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά? 4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)
Αρχίζοντας με την πλήρη κώδικα που είχα μπροστά μου στο παράδειγμα που είχα φτιάξει προχτές - τα lstSomething και lstSomethingElse είναι listbox controls 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| Dim Something As List(Of String)
Something = New List(Of String)
Something.Add("Value 1")
Something.Add("Value 2")
Something.Add(String.Empty)
Something.Add("Value 3")
Something.Add("Value 4")
Something.Add(String.Empty)
Something.Add("Value 5")
Dim lstSomethingSource As List(Of String)
lstSomethingSource = Something
lstSomething.DataSource = lstSomethingSource
Dim lstSomethingElseSource As List(Of String)
lstSomethingElseSource = (From s In Something Where s <> String.Empty Select s).ToList()
lstSomethingElse.DataSource = lstSomethingElseSource
Dim i As Integer = 0
Dim Whatever As String = "Value"
For Each s As String In lstSomething.Items
If lstSomething.Items(i).ToString = Whatever Then
Dim tmp As String = lstSomething.Items(i).ToString
Dim tmp2 As String = lstSomethingElse.Items(i).ToString
lstSomething.Items(i) = lstSomething.Items(i + 1)
lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
lstSomething.Items(i) = tmp
lstSomethingElse.Items(i) = tmp2
End If
i = i + 1
Next |
1.1 Για να μπορέσουμε να κάνουμε το DataBinding, πρέπει να έχουμε ένα αντικείμενο που ικανοποιεί το interface IEnumerable το λιγότερο - αν δεν κάνω λάθος. Το List (Of T) είναι ο συνηθησμένος τρόπος να καλύψεις αυτή την ανάγκη μιας και μπορείς να το χρησιμοποιήσεις και με την LINQ. 2. Η μεταβλητή String() είναι πιο γρήγορη από το List(Of String). Αυτό έχει να κάνει με την χρήση αποκλειστικά της μεταβλητής στο πρόγραμμα. Όμως το DataBinding επιτρέπει να φορτώσεις τα δεδομένα στο control πιο γρήγορα - αρκεί η μεταβλητή που θα δώσεις ικανοποιεί αυτά που είπαμε προγουμένως - το List(Of T) μπορεί να γίνει databind, το String() όχι. Υπόψη εδώ ότι όπου υπάρχουν generics, μπαίνουν στην μέση και τα optimizations που κάνει ο compliler που εξαρτούνται από το hardware του μηχανίματος, και δεν μπορείς να έχεις σαφή εικόνα πόσο πιο αργός ή γρήγορος θα είναι ο κώδιακας τελικά... 3. Όχι, έχω παρει τα αρχικά δεδομένα (Something) και σε αυτά ψάχνω τις τιμές - αν ήθελα να χρησιμοποιήσω τα δεδομένα που είχε το πρώτο listbox control, δεν θα έπαιρνα την συλλογή Items που έχει το listbox. Θα προτειμούσα το List(Of T) από το οποίο έχουν προκύψει. Κάθε αλλαγή στο .Items του listbox προκαλεί διάφορα events, όπως redraw στην φόρμα που κοστίζουν πολύ σε χρόνο. 3.1. Σωστά προσπαθώ να πάρω τις μη κενές τιμές. 4. Ναι 4.1. Όχι - κάθε καινούργια λίστα έχει αντίγραφα των αντικειμένων που πήρε από την λίστα από την οποία προήλθε, όχι τα ίδια. George J.
|
|
-
30-03-2012, 11:30
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Μεταξύ δύο μεταβλητών...
Thank you, this was of great help!!! :)
|
|
|
|
|